	.file "camellia-crypt-internal.asm"
	.text
	.align 16
.globl _nettle_camellia_crypt
.def _nettle_camellia_crypt
.scl 2
.type 32
.endef
_nettle_camellia_crypt:
        push	%rdi
      mov	%rcx, %rdi
            push	%rsi
      mov	%rdx, %rsi
      mov	%r8, %rdx
      mov	%r9, %rcx
      mov	56(%rsp), %r8
      mov	64(%rsp), %r9
	test	%rcx, %rcx
	jz	.Lend
	push	%rbx
	push	%rbp
	push	%r12
	push	%r13
	sub	$8, %rdi
.Lblock_loop:
	mov	(%r9), %rax
	bswap	%rax
	mov	8(%r9), %rbx
	bswap	%rbx
	add	$16, %r9
	mov	%edi, %r10d
	mov	%rsi, %r13
	xor	(%r13), %rax
	add	$8, %r13
	movzbl	%al, %ebp
	movl	(%rdx,%rbp,4), %r12d
	movzbl	%ah, %ebp
	xorl	3072(%rdx,%rbp,4), %r12d
	ror	$32, %rax
	movzbl	%al, %ebp
	movl	3072(%rdx,%rbp,4), %r11d
	movzbl	%ah, %ebp
	xorl	2048(%rdx,%rbp,4), %r11d
	rol	$16, %rax
	movzbl	%al, %ebp
	xorl	2048(%rdx,%rbp,4), %r12d
	movzbl	%ah, %ebp
	xorl	1024(%rdx,%rbp,4), %r12d
	ror	$32, %rax
	movzbl	%al, %ebp
	xorl	1024(%rdx,%rbp,4), %r11d
	movzbl	%ah, %ebp
	xorl	(%rdx,%rbp,4), %r11d
	ror	$16, %rax
	xorl	%r11d, %r12d
	rorl	$8, %r11d
	xorl	%r12d, %r11d
	shl	$32, %r12
	or	%r11, %r12
	xor	0(%r13), %rbx
	xor	%r12, %rbx
	movzbl	%bl, %ebp
	movl	(%rdx,%rbp,4), %r12d
	movzbl	%bh, %ebp
	xorl	3072(%rdx,%rbp,4), %r12d
	ror	$32, %rbx
	movzbl	%bl, %ebp
	movl	3072(%rdx,%rbp,4), %r11d
	movzbl	%bh, %ebp
	xorl	2048(%rdx,%rbp,4), %r11d
	rol	$16, %rbx
	movzbl	%bl, %ebp
	xorl	2048(%rdx,%rbp,4), %r12d
	movzbl	%bh, %ebp
	xorl	1024(%rdx,%rbp,4), %r12d
	ror	$32, %rbx
	movzbl	%bl, %ebp
	xorl	1024(%rdx,%rbp,4), %r11d
	movzbl	%bh, %ebp
	xorl	(%rdx,%rbp,4), %r11d
	ror	$16, %rbx
	xorl	%r11d, %r12d
	rorl	$8, %r11d
	xorl	%r12d, %r11d
	shl	$32, %r12
	or	%r11, %r12
	xor	8(%r13), %rax
	xor	%r12, %rax
	movzbl	%al, %ebp
	movl	(%rdx,%rbp,4), %r12d
	movzbl	%ah, %ebp
	xorl	3072(%rdx,%rbp,4), %r12d
	ror	$32, %rax
	movzbl	%al, %ebp
	movl	3072(%rdx,%rbp,4), %r11d
	movzbl	%ah, %ebp
	xorl	2048(%rdx,%rbp,4), %r11d
	rol	$16, %rax
	movzbl	%al, %ebp
	xorl	2048(%rdx,%rbp,4), %r12d
	movzbl	%ah, %ebp
	xorl	1024(%rdx,%rbp,4), %r12d
	ror	$32, %rax
	movzbl	%al, %ebp
	xorl	1024(%rdx,%rbp,4), %r11d
	movzbl	%ah, %ebp
	xorl	(%rdx,%rbp,4), %r11d
	ror	$16, %rax
	xorl	%r11d, %r12d
	rorl	$8, %r11d
	xorl	%r12d, %r11d
	shl	$32, %r12
	or	%r11, %r12
	xor	16(%r13), %rbx
	xor	%r12, %rbx
	movzbl	%bl, %ebp
	movl	(%rdx,%rbp,4), %r12d
	movzbl	%bh, %ebp
	xorl	3072(%rdx,%rbp,4), %r12d
	ror	$32, %rbx
	movzbl	%bl, %ebp
	movl	3072(%rdx,%rbp,4), %r11d
	movzbl	%bh, %ebp
	xorl	2048(%rdx,%rbp,4), %r11d
	rol	$16, %rbx
	movzbl	%bl, %ebp
	xorl	2048(%rdx,%rbp,4), %r12d
	movzbl	%bh, %ebp
	xorl	1024(%rdx,%rbp,4), %r12d
	ror	$32, %rbx
	movzbl	%bl, %ebp
	xorl	1024(%rdx,%rbp,4), %r11d
	movzbl	%bh, %ebp
	xorl	(%rdx,%rbp,4), %r11d
	ror	$16, %rbx
	xorl	%r11d, %r12d
	rorl	$8, %r11d
	xorl	%r12d, %r11d
	shl	$32, %r12
	or	%r11, %r12
	xor	24(%r13), %rax
	xor	%r12, %rax
	movzbl	%al, %ebp
	movl	(%rdx,%rbp,4), %r12d
	movzbl	%ah, %ebp
	xorl	3072(%rdx,%rbp,4), %r12d
	ror	$32, %rax
	movzbl	%al, %ebp
	movl	3072(%rdx,%rbp,4), %r11d
	movzbl	%ah, %ebp
	xorl	2048(%rdx,%rbp,4), %r11d
	rol	$16, %rax
	movzbl	%al, %ebp
	xorl	2048(%rdx,%rbp,4), %r12d
	movzbl	%ah, %ebp
	xorl	1024(%rdx,%rbp,4), %r12d
	ror	$32, %rax
	movzbl	%al, %ebp
	xorl	1024(%rdx,%rbp,4), %r11d
	movzbl	%ah, %ebp
	xorl	(%rdx,%rbp,4), %r11d
	ror	$16, %rax
	xorl	%r11d, %r12d
	rorl	$8, %r11d
	xorl	%r12d, %r11d
	shl	$32, %r12
	or	%r11, %r12
	xor	32(%r13), %rbx
	xor	%r12, %rbx
	movzbl	%bl, %ebp
	movl	(%rdx,%rbp,4), %r12d
	movzbl	%bh, %ebp
	xorl	3072(%rdx,%rbp,4), %r12d
	ror	$32, %rbx
	movzbl	%bl, %ebp
	movl	3072(%rdx,%rbp,4), %r11d
	movzbl	%bh, %ebp
	xorl	2048(%rdx,%rbp,4), %r11d
	rol	$16, %rbx
	movzbl	%bl, %ebp
	xorl	2048(%rdx,%rbp,4), %r12d
	movzbl	%bh, %ebp
	xorl	1024(%rdx,%rbp,4), %r12d
	ror	$32, %rbx
	movzbl	%bl, %ebp
	xorl	1024(%rdx,%rbp,4), %r11d
	movzbl	%bh, %ebp
	xorl	(%rdx,%rbp,4), %r11d
	ror	$16, %rbx
	xorl	%r11d, %r12d
	rorl	$8, %r11d
	xorl	%r12d, %r11d
	shl	$32, %r12
	or	%r11, %r12
	xor	40(%r13), %rax
	xor	%r12, %rax
.Lround_loop:
	add	$64, %r13
	mov	%rax, %rbp
	shr	$32, %rbp
	andl	-16 + 4(%r13), %ebp
	roll	$1, %ebp
	xor	%rbp, %rax
	movl	-16(%r13), %ebp
	orl	%eax, %ebp
	shl	$32, %rbp
	xor	%rbp, %rax
	movl	-8(%r13), %ebp
	orl	%ebx, %ebp
	shl	$32, %rbp
	xor	%rbp, %rbx
	mov	%rbx, %rbp
	shr	$32, %rbp
	andl	-8 + 4(%r13), %ebp
	roll	$1, %ebp
	xor	%rbp, %rbx
	movzbl	%al, %ebp
	movl	(%rdx,%rbp,4), %r12d
	movzbl	%ah, %ebp
	xorl	3072(%rdx,%rbp,4), %r12d
	ror	$32, %rax
	movzbl	%al, %ebp
	movl	3072(%rdx,%rbp,4), %r11d
	movzbl	%ah, %ebp
	xorl	2048(%rdx,%rbp,4), %r11d
	rol	$16, %rax
	movzbl	%al, %ebp
	xorl	2048(%rdx,%rbp,4), %r12d
	movzbl	%ah, %ebp
	xorl	1024(%rdx,%rbp,4), %r12d
	ror	$32, %rax
	movzbl	%al, %ebp
	xorl	1024(%rdx,%rbp,4), %r11d
	movzbl	%ah, %ebp
	xorl	(%rdx,%rbp,4), %r11d
	ror	$16, %rax
	xorl	%r11d, %r12d
	rorl	$8, %r11d
	xorl	%r12d, %r11d
	shl	$32, %r12
	or	%r11, %r12
	xor	0(%r13), %rbx
	xor	%r12, %rbx
	movzbl	%bl, %ebp
	movl	(%rdx,%rbp,4), %r12d
	movzbl	%bh, %ebp
	xorl	3072(%rdx,%rbp,4), %r12d
	ror	$32, %rbx
	movzbl	%bl, %ebp
	movl	3072(%rdx,%rbp,4), %r11d
	movzbl	%bh, %ebp
	xorl	2048(%rdx,%rbp,4), %r11d
	rol	$16, %rbx
	movzbl	%bl, %ebp
	xorl	2048(%rdx,%rbp,4), %r12d
	movzbl	%bh, %ebp
	xorl	1024(%rdx,%rbp,4), %r12d
	ror	$32, %rbx
	movzbl	%bl, %ebp
	xorl	1024(%rdx,%rbp,4), %r11d
	movzbl	%bh, %ebp
	xorl	(%rdx,%rbp,4), %r11d
	ror	$16, %rbx
	xorl	%r11d, %r12d
	rorl	$8, %r11d
	xorl	%r12d, %r11d
	shl	$32, %r12
	or	%r11, %r12
	xor	8(%r13), %rax
	xor	%r12, %rax
	movzbl	%al, %ebp
	movl	(%rdx,%rbp,4), %r12d
	movzbl	%ah, %ebp
	xorl	3072(%rdx,%rbp,4), %r12d
	ror	$32, %rax
	movzbl	%al, %ebp
	movl	3072(%rdx,%rbp,4), %r11d
	movzbl	%ah, %ebp
	xorl	2048(%rdx,%rbp,4), %r11d
	rol	$16, %rax
	movzbl	%al, %ebp
	xorl	2048(%rdx,%rbp,4), %r12d
	movzbl	%ah, %ebp
	xorl	1024(%rdx,%rbp,4), %r12d
	ror	$32, %rax
	movzbl	%al, %ebp
	xorl	1024(%rdx,%rbp,4), %r11d
	movzbl	%ah, %ebp
	xorl	(%rdx,%rbp,4), %r11d
	ror	$16, %rax
	xorl	%r11d, %r12d
	rorl	$8, %r11d
	xorl	%r12d, %r11d
	shl	$32, %r12
	or	%r11, %r12
	xor	16(%r13), %rbx
	xor	%r12, %rbx
	movzbl	%bl, %ebp
	movl	(%rdx,%rbp,4), %r12d
	movzbl	%bh, %ebp
	xorl	3072(%rdx,%rbp,4), %r12d
	ror	$32, %rbx
	movzbl	%bl, %ebp
	movl	3072(%rdx,%rbp,4), %r11d
	movzbl	%bh, %ebp
	xorl	2048(%rdx,%rbp,4), %r11d
	rol	$16, %rbx
	movzbl	%bl, %ebp
	xorl	2048(%rdx,%rbp,4), %r12d
	movzbl	%bh, %ebp
	xorl	1024(%rdx,%rbp,4), %r12d
	ror	$32, %rbx
	movzbl	%bl, %ebp
	xorl	1024(%rdx,%rbp,4), %r11d
	movzbl	%bh, %ebp
	xorl	(%rdx,%rbp,4), %r11d
	ror	$16, %rbx
	xorl	%r11d, %r12d
	rorl	$8, %r11d
	xorl	%r12d, %r11d
	shl	$32, %r12
	or	%r11, %r12
	xor	24(%r13), %rax
	xor	%r12, %rax
	movzbl	%al, %ebp
	movl	(%rdx,%rbp,4), %r12d
	movzbl	%ah, %ebp
	xorl	3072(%rdx,%rbp,4), %r12d
	ror	$32, %rax
	movzbl	%al, %ebp
	movl	3072(%rdx,%rbp,4), %r11d
	movzbl	%ah, %ebp
	xorl	2048(%rdx,%rbp,4), %r11d
	rol	$16, %rax
	movzbl	%al, %ebp
	xorl	2048(%rdx,%rbp,4), %r12d
	movzbl	%ah, %ebp
	xorl	1024(%rdx,%rbp,4), %r12d
	ror	$32, %rax
	movzbl	%al, %ebp
	xorl	1024(%rdx,%rbp,4), %r11d
	movzbl	%ah, %ebp
	xorl	(%rdx,%rbp,4), %r11d
	ror	$16, %rax
	xorl	%r11d, %r12d
	rorl	$8, %r11d
	xorl	%r12d, %r11d
	shl	$32, %r12
	or	%r11, %r12
	xor	32(%r13), %rbx
	xor	%r12, %rbx
	movzbl	%bl, %ebp
	movl	(%rdx,%rbp,4), %r12d
	movzbl	%bh, %ebp
	xorl	3072(%rdx,%rbp,4), %r12d
	ror	$32, %rbx
	movzbl	%bl, %ebp
	movl	3072(%rdx,%rbp,4), %r11d
	movzbl	%bh, %ebp
	xorl	2048(%rdx,%rbp,4), %r11d
	rol	$16, %rbx
	movzbl	%bl, %ebp
	xorl	2048(%rdx,%rbp,4), %r12d
	movzbl	%bh, %ebp
	xorl	1024(%rdx,%rbp,4), %r12d
	ror	$32, %rbx
	movzbl	%bl, %ebp
	xorl	1024(%rdx,%rbp,4), %r11d
	movzbl	%bh, %ebp
	xorl	(%rdx,%rbp,4), %r11d
	ror	$16, %rbx
	xorl	%r11d, %r12d
	rorl	$8, %r11d
	xorl	%r12d, %r11d
	shl	$32, %r12
	or	%r11, %r12
	xor	40(%r13), %rax
	xor	%r12, %rax
	sub 	$8, %r10
	ja	.Lround_loop
	bswap	%rax
	mov	%rax, 8(%r8)
	xor	48(%r13), %rbx
	bswap	%rbx
	mov	%rbx, (%r8)
	add	$16, %r8
	sub	$16, %rcx
	ja	.Lblock_loop
	pop	%r13
	pop	%r12
	pop	%rbp
	pop	%rbx
.Lend:
      pop	%rsi
    pop	%rdi
	ret
